<?php

require_once APPLICATION_PATH . '/forms/Login.php';
require_once APPLICATION_PATH . '/forms/NuevoUsuario.php';
require_once APPLICATION_PATH . '/forms/Mensaje.php';
require_once APPLICATION_PATH . '/forms/BuscarUsuario.php';

class UsuarioController extends Zend_Controller_Action
{

    private $clave = 'dhshas';

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->_redirect('/usuario/consultar');
    }

    public function loginAction()
    {
        $this->view->title = "Identifiquese";

        $this->view->headTitle($this->view->title, 'PREPEND');

        $form = new Form_Login();

        $this->view->form = $form;

        if ($this->getRequest()->isPost()) {

            $formData = $this->getRequest()->getPost();

            if ($form->isValid($formData)) {

                try {

                    $loginName = $form->getValue('loginName');

                    $pass = $form->getValue('password');
                    $password = mcrypt_ecb (MCRYPT_3DES, $this->clave, $pass, MCRYPT_ENCRYPT);
                    $rememberMe = (bool) $form->getValue('recordarme');



                    $usuarioModel = new Spalm_Model_Single_UsuarioEntity();

                    $consultaUsuario = $usuarioModel->getMapper()->getDbtable()->select();

                    $consultaUsuario->where('login_name = ?',$loginName);



                    $usuarios = $usuarioModel->fetchAll($consultaUsuario);



                    switch (count($usuarios)){

                        case 0 :

                            $this->mostrarMensaje('Error', 'Usted no es un usuario registrado. Por favor, comuniquese con el administrador');

                            break;

                        case 1 :

                            $usuario = current($usuarios);



                            if ($usuario->getPassword() == $password){

                                $sesion = new Zend_Session_Namespace('spalm');

                                $sesion->usuario = $usuario;
                                $sesion->urlActual = $this->view->url(array('controller'=>'usuario','action'=>'login'));
                                $sesion->urlAnterior = $this->view->url(array('controller'=>'usuario','action'=>'login'));



                                if ($rememberMe){

                                    Zend_Session::rememberMe(60*60*24*7);

                                }

                                $this->_redirect('/');

                            }

                            else {

                                $this->mostrarMensaje('Error', 'La contraseña es incorrecta');

                            }



                            break;

                        default :

                            $this->mostrarMensaje('Error', 'Existe mas de un usuario con el mismo nombre');

                            break;

                    }

                }

                catch (Exception $e){

                    $this->mostrarMensaje('Error', $e->getMessage());

                }

            } else {

                $form->populate($formData);

            }

        }
    }

    public function logoutAction()
    {
        Zend_Session::destroy(true);

        $this->_redirect('/usuario/login');
    }

    public function registrarAction()
    {

        if (!$this->haySesion('registrar')){
            $this->_redirect('/usuario/login');
        }

        $this->view->title = "Registro";

        $this->view->headTitle($this->view->title, 'PREPEND');

        $listaLocalidades = $this->getLocalidades();

        if (count($listaLocalidades) == 0){
            $this->mostrarMensaje('Error', 'No hay localidades cargadas en la base');
        }

        $session = new Zend_Session_Namespace('spalm');
        $form = new Form_NuevoUsuario($listaLocalidades,$session->urlAnterior);

        $this->view->form = $form;



        if ($this->getRequest()->isPost()) {

            $formData = $this->getRequest()->getPost();

            if ($form->isValid($formData)) {

                try {

                    $localidadesModel = new Spalm_Model_Single_LocalidadEntity();

                    $localidad = $localidadesModel->find((int) $form->getValue('localidades'));



                    $pass = $form->getValue('password');

                    $repetirPassword = $form->getValue('repetirPassword');



                    if ($pass == $repetirPassword){
                        $password = mcrypt_ecb (MCRYPT_3DES, $this->clave, $pass, MCRYPT_ENCRYPT);

                        $usuario = new Spalm_Model_Single_UsuarioEntity();



                        $usuario->setNombre($form->getValue('nombre'));

                        $usuario->setApellido($form->getValue('apellido'));

                        $usuario->setEmail($form->getValue('email'));

                        $usuario->setLocalidad($localidad);

                        $usuario->setLoginName($form->getValue('loginName'));

                        $usuario->setPassword($password);



                        $fecha = $form->getValue('fechaNacimiento');

                        if ($fecha == ''){

                            $usuario->setFechaNacimiento(null);

                        }

                        else {

                            $usuario->setFechaNacimiento($fecha);

                        }



                        $usuario->save();



                        $this->mostrarMensaje('Exito', 'El usuario ha sido registrado exitosamente');

                    }

                    else {

                        $this->mostrarMensaje('Error', 'Las contraseñas no coinciden','usuario/registrar');

                    }

                }

                catch (Exception $e){

                    $this->mostrarMensaje('Error', $e->getMessage());

                }

            } else {

                $form->populate($formData);

            }

        }
    }

    public function eliminarAction()
    {

        if (!$this->haySesion('eliminar')){
            $this->_redirect('/usuario/login');
        }

        $id = (int)$this->_request->getParam('id', 0);



        $usuariosModel = new Spalm_Model_Single_UsuarioEntity();

        $usuario = $usuariosModel->find($id);



        $redirigir = '/usuario/consultar';



        if (null !== $usuario) {

            try {

                if ($usuario->isRemovable()){

                    $usuario->remove();

                    $this->mostrarMensaje('Exito', 'El usuario ha sido eliminado con exito');

                }

                else {

                    $this->mostrarMensaje('Error', 'No se puede eliminar el usuario. Esta siendo usado');

                }

            } catch (Exception $e) {

                $this->mostrarMensaje('Error', $e->getMessage());

            }

        } else{

            $this->mostrarMensaje('Error', 'El usuario no existe');

        }

        $this->_redirect($redirigir);
    }

    public function consultarAction()
    {

        if (!$this->haySesion('consultar')){
            $this->_redirect('/usuario/login');
        }

        $this->view->title = "Listado de Usuarios";

        $urlCriterio = $this->_request->getParam('criterio', null);

        $urlABuscar = $this->_request->getParam('mostrar', null);

        // si hay que realizar una busqueda

        if ($urlCriterio !== null && $urlABuscar !== null){

            $criterio = urldecode($urlCriterio);

            $aBuscar = urldecode($urlABuscar);

            $usuariosModel = new Spalm_Model_Single_UsuarioEntity();

            $select = $usuariosModel->getMapper()->getDbTable()->select();

            switch ($criterio) {

                case 'nombre' :
                    $aBuscar = '%' . $aBuscar . '%';
                    $select->where('nombre LIKE ?',$aBuscar);

                    break;

                case 'apellido' :
                    $aBuscar = '%' . $aBuscar . '%';
                    $select->where('apellido LIKE ?',$aBuscar);

                    break;

                case 'localidad' :

                    $localidadModel = new Spalm_Model_Single_LocalidadEntity();
                    $consultaLocalidad = $localidadModel->getMapper()->getDbtable()->select();
                    $consultaLocalidad->where('nombre = ?',$aBuscar);

                    $resultado = $localidadModel->fetchAll($consultaLocalidad);

                    if (count($resultado) == 0){
                        $this->mostrarMensaje('Error', 'La localidad no existe');
                    }

                    $localidad = current($resultado);

                    $select->where('localidad_id = ?',$localidad->getPK());

                    break;
                case 'fechaNacimiento' :
                    $aBuscar = '%' . $aBuscar . '%';
                    $select->where('fecha_nacimiento LIKE ?',$aBuscar);
                    break;
                case 'loginName' :
                    $aBuscar = '%' . $aBuscar . '%';
                    $select->where('login_name LIKE ?',$aBuscar);
                    break;
                case 'email' :
                    $aBuscar = '%' . $aBuscar . '%';
                    $select->where('email LIKE ?',$aBuscar);
                    break;

            }

        }

        else { // si no, recuperar todo

            $select = null;

        }

        $usuario = new Spalm_Model_Single_UsuarioEntity();

        $this->view->usuarios = $usuario->fetchAll($select);
    }

    public function mostrarAction()
    {

        $urlTitulo = $this->_request->getParam('titulo', null);

        $urlMensaje = $this->_request->getParam('mensaje', null);

        $urlDestino = $this->_request->getParam('destino', null);

        $titulo = urldecode($urlTitulo);

        $mensaje = urldecode($urlMensaje);

        $destinoTemp = urldecode($urlDestino);

        $partes = explode('-', $destinoTemp);

        $temp = implode('/', $partes);

        $this->view->title = $titulo;

        $form = new Form_Mensaje($mensaje);

        $this->view->form = $form;



        if ($this->_request->isPost())

        {

            $formData = $this->_request->getPost();

            if (!$form->isValid($formData)) {

                $form->populate($formData);

                return;

            }

            $destino = ($urlDestino === null) ? '/usuario/consultar' : $temp;

            $this->_redirect($destino);

        }
    }

    public function buscarAction()
    {

        if (!$this->haySesion('buscar')){
            $this->_redirect('/usuario/login');
        }

        $this->view->title = "Buscar Usuarios";

        $session = new Zend_Session_Namespace('spalm');
        $form = new Form_BuscarUsuario($session->urlAnterior);

        $this->view->form = $form;

        if ($this->_request->isPost())

        {

            $formData = $this->_request->getPost();

            if (!$form->isValid($formData)) {

                $form->populate($formData);

                return;

            }
            $criterio = $form->getValue('criterio');

            $aBuscar = $form->getValue('buscado');

            $this->_redirect("/usuario/consultar/criterio/" . urlencode($criterio) . "/mostrar/" . urlencode($aBuscar));

        }
    }

    private function mostrarMensaje($tituloIn,$mensajeIn,$irA = null)
    {
        $titulo = urlencode($tituloIn);

        $mensaje = urlencode($mensajeIn);

        $redirigir = '/usuario/mostrar/titulo/' . $titulo . '/mensaje/' . $mensaje;

        if ($irA !== null){

            $partes = explode('/', $irA);

            $temp = implode('-', $partes);

            $destino = urlencode($temp);

            $redirigir .= '/destino/' . $destino;

        }

        $this->_redirect($redirigir);
    }

    public function editarAction()
    {

        if (!$this->haySesion('editar')){
            $this->_redirect('/usuario/login');
        }

        $id = (int)$this->_request->getParam('id', 0);
        $this->view->title = "Editar Usuario";


        $usuarioModel = new Spalm_Model_Single_UsuarioEntity();
        $usuario = $usuarioModel->find($id);

        $listaLocalidades = $this->getLocalidades();

        if (count($listaLocalidades) == 0){
            $this->mostrarMensaje('Error', 'No hay localidades cargadas en la base');
        }

        $session = new Zend_Session_Namespace('spalm');
        $form = new Form_NuevoUsuario($listaLocalidades,$session->urlAnterior,$usuario);
        $this->view->form = $form;

        if (null === $usuario) {
            $this->mostrarMensaje('Error', 'El usuario no existe');
        }

        if ($this->_request->isPost())
        {
            $formData = $this->_request->getPost();
            if (!$form->isValid($formData)) {
                $form->populate($formData);
                return;
            }

            try {
                $localidadModel = new Spalm_Model_Single_LocalidadEntity();
                $localidad = $localidadModel->find( (int) $form->getValue('localidades'));

                $usuario->setNombre($form->getValue('nombre'));
                $usuario->setLocalidad($localidad);
                $usuario->setApellido($form->getValue('apellido'));
                $usuario->setLoginName($form->getValue('loginName'));
                $usuario->setFechaNacimiento($form->getValue('fechaNacimiento'));
                $usuario->setEmail($form->getValue('email'));


                $usuario->save();

                $this->mostrarMensaje('Exito', 'El usuario ha sido guardada con exito');

            } catch (Exception $e) {
                $this->mostrarMensaje('Error', $e->getMessage());
            }
        }
    }


    private function haySesion($action) {
        $salida = false;

        if (Zend_Session::namespaceIsset('spalm')){
            $session = new Zend_Session_Namespace('spalm');

            if (isset ($session->usuario)){
                $salida = true;

                $session->urlAnterior = $session->urlActual;
                $session->urlActual = $this->view->url(array('controller'=>'usuario','action'=>$action));
            }
        }

        return $salida;
    }

    private function getLocalidades() {
        $localidadesModel = new Spalm_Model_Single_LocalidadEntity();
        $localidades = $localidadesModel->fetchAll();

        $listaLocalidades = array();

        foreach ($localidades as $localidadActual) {
            $listaLocalidades[$localidadActual->getPK()] = $localidadActual->getNombre();
        }

        return $listaLocalidades;
    }

}

















